package cn.stylefeng.roses.kernel.saas.timer;

import cn.hutool.extra.spring.SpringUtil;
import cn.stylefeng.roses.kernel.saas.api.SaasTenantApi;
import cn.stylefeng.roses.kernel.saas.api.constants.SaasConstants;
import cn.stylefeng.roses.kernel.saas.api.util.SaasCodeUtil;
import cn.stylefeng.roses.kernel.saas.service.TenantService;
import cn.stylefeng.roses.kernel.timer.api.TimerAction;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 预分配初始化租户数据库定时任务
 *
 * @author luojie
 * @date 2021/2/23 11:33
 */
@Component
@Slf4j
public class AssignableTenantDatabasesTimer implements TimerAction {

    @Override
    public void action(String params) {
        TenantService tenantService = SpringUtil.getBean(TenantService.class);
        SaasTenantApi saasTenantApi = SpringUtil.getBean(SaasTenantApi.class);

        // 数据库预创建数
        int databasesCount = SaasConstants.ASSIGNABLE_TENANT_DATABASES_COUNT;
        log.info("租户数据库预分配数：" + databasesCount);

        // 获取租户可分配数据库code列表
        List<String> assignableTenantDatabasesCode = tenantService.calcAssignableTenantCodeArray();

        // 判断租户可分配的数据库code列表是否小于预分配数 如果小于则创建数据库
        int assignableSize = assignableTenantDatabasesCode.size();
        log.info("租户可分配的数据库数量：" + assignableSize);

        if (assignableSize < databasesCount) {
            // 计算需要创建数据库的个数
            int diff = databasesCount - assignableSize;
            log.info("需要初始化的数据库个数：" + diff);

            for (int i = 0; i < diff; i++) {
                // 生成租户数据库编码
                String tenantCode = SaasCodeUtil.getTenantCode();
                log.info("生成的租户数据库编码：" + tenantCode);
                // 初始化租户数据库
                saasTenantApi.initTenantDb(tenantCode, SaasConstants.SAAS_INIT_SQL);
            }
        }
    }

}
